// 模拟
// 思路比较简单 - 直接根据题目要求进行模拟
// 一定要在演草纸上手动模拟算法流程，避免凭空想象

// 例题 1：
// 给你一个仅包含小写英文字母和 '?' 字符的字符串 s，请你将所有的 '?' 转换为若干小写字母，
// 使最终的字符串不包含任何 连续重复 的字符。
//
//        注意：你 不能 修改非 '?' 字符。
//
//        题目测试用例保证 除 '?' 字符 之外，不存在连续重复的字符。
//
//        在完成所有转换（可能无需转换）后返回最终的字符串。如果有多个解决方案，请返回其中任何一个。
//        可以证明，在给定的约束条件下，答案总是存在的。
//
//        示例 1：
//
//        输入：s = "?zs"
//        输出："azs"
//        解释：该示例共有 25 种解决方案，从 "azs" 到 "yzs" 都是符合题目要求的。
//        只有 "z" 是无效的修改，因为字符串 "zzs" 中有连续重复的两个 'z' 。
//        示例 2：
//
//        输入：s = "ubv?w"
//        输出："ubvaw"
//        解释：该示例共有 24 种解决方案，只有替换成 "v" 和 "w" 不符合题目要求。
//        因为 "ubvvw" 和 "ubvww" 都包含连续重复的字符。
//
//        提示：
//
//        1 <= s.length <= 100
//
//        s 仅包含小写英文字母和 '?' 字符

// 解题思路：
// 保证处于 i 位置的字符和 i - 1 位置和 i + 1 位置的字符不重复即可
// 当'?' 在最前面 或者 '?' 在最后面，就不需要看 i - 1 或者 i + 1 位置字符即可

public class ModifyString {
    public String modifyString(String s) {
        int n = s.length();
        StringBuilder ret = new StringBuilder();
        for(int i = 0; i < n; i++){
            char ch = s.charAt(i);
            if(ch != '?') ret.append(ch);
            else{
                char c = 'a';
                while((i > 0 && c == ret.charAt(i - 1)) || (i < (n - 1) && c == s.charAt(i + 1))) c++;
                ret.append(c);
            }
        }
        return ret.toString();
    }
}